package com.atguigu.tingshu.album.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.TrackInfoMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private TrackInfoMapper trackInfoMapper;

	// TODO 业务校验 判断内容是否违规
	//保存专辑
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(Long userId, AlbumInfo albumInfo) {
		//封装专辑相关信息,保存一条记录到专辑信息表
		//设置用户ID
		albumInfo.setUserId(userId);
		//设置 免费试听集数
		albumInfo.setTracksForFree(5);
		//设置专辑内容审核状态
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS);
		//保存专辑
		albumInfoMapper.insert(albumInfo);
		//获取专辑ID
		Long albumId = albumInfo.getId();
		//封装专辑标签关系集合,保存若干条记录到转机标签关系表
		//获取入参中包含标签列表
		List<AlbumAttributeValue> albumAttributeValueVoList = albumInfo.getAlbumAttributeValueVoList();
		//判断标签列表是否为空
		if (CollectionUtil.isNotEmpty(albumAttributeValueVoList)) {
			//遍历标签列表封装专辑标签关系对象
			for (AlbumAttributeValue albumAttributeValue : albumAttributeValueVoList) {

				albumAttributeValue.setAlbumId(albumId);
				//保存专辑标签关系
				albumAttributeValueMapper.insert(albumAttributeValue);
			}
		}
		//封装专辑统计信息,保存4条记录到专辑统计表
		this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0);
		this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0);
		this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0);
		this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0);

		// TODO 业务校验 验证专辑内填写相关文本信息是否合法 根据审核结果设置审核状态


	}

	/**
	 * 保存专辑统计信息
	 *
	 * @param albumId  专辑ID
	 * @param statType 统计类型
	 * @param statNum  统计数值 0401-播放量 0402-订阅量 0403-购买量 0403-评论数'
	 */
	@Override
	public void saveAlbumInfoStat(Long albumId, String statType, int statNum) {
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(statNum);
		albumStatMapper.insert(albumStat);
	}


	//查看当前用户专辑分页列表
	@Override
	public Page<AlbumListVo> getUserAlbumPage(Page<AlbumListVo> pageInfo, Long userId, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.getUserAlbumPage(pageInfo, userId, albumInfoQuery);
	}


	//根据专辑ID删除专辑
	@Override
	public void removeAlbumInfo(Long id) {
		//判断专辑下是否关联声音
		LambdaQueryWrapper<TrackInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(TrackInfo::getAlbumId,id);
		Long count = trackInfoMapper.selectCount(queryWrapper);
		if (count > 0){
			throw new GuiguException(500,"该专辑下存在声音");
		}
		//删除专辑记录
		trackInfoMapper.deleteById(id);
		//删除统计记录
		LambdaQueryWrapper<AlbumStat> albumStatLambdaQueryWrapper = new LambdaQueryWrapper<>();
		albumStatLambdaQueryWrapper.eq(AlbumStat::getAlbumId,id);
		albumStatMapper.delete(albumStatLambdaQueryWrapper);
		//删除标签记录
		LambdaQueryWrapper<AlbumAttributeValue> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		lambdaQueryWrapper.eq(AlbumAttributeValue::getAlbumId,id);
		albumAttributeValueMapper.delete(lambdaQueryWrapper);
	}


	//根据专辑ID查询专辑信息(包括专辑标签列表)
	@Override
	public AlbumInfo getAlbumInfo(Long id) {
		//获取专辑ID
		AlbumInfo albumInfo = albumInfoMapper.selectById(id);
		//  TODO 检查专辑是否为下架状态

		//根据专辑ID查询标签列表
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumAttributeValue::getAlbumId,id);
		List<AlbumAttributeValue> albumAttributeValue = albumAttributeValueMapper.selectList(queryWrapper);
		if (CollectionUtil.isNotEmpty(albumAttributeValue)){
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValue);
		}
		return albumInfo;
	}


	//修改专辑
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateAlbumInfo(AlbumInfo albumInfo) {
		//修改专辑相关信息
		albumInfoMapper.updateById(albumInfo);
		Long albumId = albumInfo.getId();
		//修改专辑标签关系

		//根据专辑ID删除专辑标签关系记录
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(queryWrapper);
		//重新保存专辑标签关系
		List<AlbumAttributeValue> albumAttributeValueVoList = albumInfo.getAlbumAttributeValueVoList();
		if (CollectionUtil.isNotEmpty(albumAttributeValueVoList)){
			for (AlbumAttributeValue albumAttributeValue : albumAttributeValueVoList) {
				albumAttributeValue.setAlbumId(albumId);
				albumAttributeValueMapper.insert(albumAttributeValue);
			}
		}
		// TODO 对修改后的值再次进行内容审核
	}
}
